// 路由鉴权,项目当中路由能不能被访问的权限设置
import router from '@/router/index'
// 引入进度条插件
import nprogress from 'nprogress'
nprogress.configure({ showSpinner: false })
import settings from './settings'
// 引入用户小仓库
import useUserStore from './store/modules/user'
// 因为该文件直接被引入到了main.ts文件中,作为同级文件使用的时候pinia是还未创建成功的
import pinia from './store'
const userStore = useUserStore(pinia)
// 引入进度条样式
import 'nprogress/nprogress.css'
// 全局守卫:项目中任意路由切换都会触发的钩子
// 全局前置守卫
router.beforeEach(async (to: any, from: any, next: any) => {
  // 修改该标题
  document.title = `${settings.title}-${to.meta.title}`
  //  to:你将要访问哪个路由
  // from:你从哪个路由而来
  // next:路由的放行函数
  nprogress.start()
  // 获取用户token判断用户是否登录成功
  const token = userStore.token
  // 用户登录判断
  if (token) {
    // 登录成功,访问login,指向首页
    if (to.path == '/login') {
      next('/home')
    } else {
      // 已登录访问其他的,都放行
      // 有用户信息
      if (userStore.username) {
        next()
      } else {
        // 如果没有用户信息,在守卫这里发请求获取到了用户信息再放行
        try {
          await userStore.userInfo()
          // 获取成功,放行
          next({ ...to })
        } catch (error) {
          // token过期或者被用户本地修改了token
          // 退出登录
          await userStore.userLogout()
          next({ path: '/login', query: { redirect: to.path } })
        }
      }
    }
  } else {
    // 用户未登录,去往登录页
    if (to.path == '/login') {
      // 如果是登录页,则放行
      next()
    } else {
      // 否则去往登录页,并携带上原本想要访问的地址
      next({ path: '/login', query: { redirect: to.path } })
    }
  }
})
// 全局后置守卫
router.afterEach((to: any, from: any, failure: any) => {
  nprogress.done()
})

// 第一个问题:任意路由切换实现进度条业务:nprogress
// 第二个问题:路由鉴权(路由组件访问权限问题)
// 全部路由组件:登录|404|任意路由|首页|数据大屏|权限管理(三个子路由)|商品管理(4个子路由)

// 用户未登录: 可以访问/login,其余都不行
// 用户登录后: 不可以访问login,其余都可以
